(function(window){
    /**
     * 
     * @param {*} prefix 前缀
     * @param {Array} defCart购物车初始化[{name:"",price:1,num:1}] 
     */
    var ShopCart = function(prefix,defCart){
        Find.prototype.prefix = prefix;  //将HTML元素的前缀传给Find查找器
        var cart = new Cart(document.getElementsByClassName(prefix)[0]);
        for(var i in defCart){
            cart.add(defCart[i]);
        }
        cart.updateTotal();
    }


    //Cart购物车商品管理
    function Cart(obj){
        this.items = [];  //定义所有商品，用数组形式
        var find = new Find(obj);
        this.all = find.className('all');  //cart-bottom
        this.bottom = find.className('bottom');
        this.num = find.className('total-num');  //获取购物车的数目
        this.price = find.className('total-price');  //获取购物车底部的价格
        this.tmp = find.className('item');  //获取购物车商品的每个条目
        this.tmp.parentNode.removeChild(this.tmp);
        var cart = this;
        this.all.onclick = function(){
            cart.checkAll();
        };
    }

    Cart.prototype = {
        //商品的增加
        add:function(data){
            var tmp = this.tmp.cloneNode(true);  //cloneNode 拷贝所有属性的值
            var item = new Item(tmp,data);
            var cart = this;
            //选中某件商品
            item.check.onclick = function(){
                cart.updateTotal();
            }
            //某件商品增加数量
            item.add.onclick = function(){
                item.num.textContent = ++item.data.num;
                cart.updateTotal();  //更新总计
                item.updateSubtotal();  //更新小计
            }
            //减少某件商品的数量
            item.reduce.onclick = function(){
                if(item.data.num > 1){
                    item.name.textContent = --item.data.num;
                    cart.updateTotal();
                    item.updateSubtotal();
                }else{
                    alert("至少选择1件，如果不需要，请直接删除！")
                }
            }
            item.del.onclick = function(){
                if(confirm("你确定要删除此商品吗？")){
                    tmp.parentNode.removeChild(tmp);  //将条目全部进行删除
                    cart.del(item);
                    cart.updateTotal();
                }
            }
            item.updateSubtotal();
            //保存新增的商品对象
            this.items.push(item);
            //在购物车底部之前新增一个条目
            this.bottom.before(tmp);
        },
        //商品的删除
        del:function(item){
            for(var i in this.items){
                if(this.items[i] == item){
                    delete this.items[i];
                }
            }
        },
        //更新商品的总计
        updateTotal:function(){
            var num = 0,price = 0;
            for(var i in this.items){
                var item = this.items[i];
                if(item.check.checked){
                    num += item.data.num;
                    price += item.data.num * item.data.price;
                }
            }
            this.num.textContent = num;
            this.price.textContent = price.toFixed(2);
        },
        //全选
        checkAll:function(){
            for(var i in this.items){
                this.items[i].check.checked = true;
            }
            this.updateTotal();
        }
    };

    /**
     * 
     * @param {String} tmp 
     * @param {Array} data 相当于数据库传递过来的数据
     */
    function Item(tmp,data){
        var find = new Find(tmp);
        this.check = find.className('check');
        this.name = find.className('name');
        this.price = find.className('price');
        this.num = find.className('num');
        this.add = find.className('add');
        this.reduce = find.className('reduce');
        this.subtotal = find.className('subtotal');
        this.del = find.className('del');
        //赋值操作
        this.data = data;
        this.name.textContent = data.name;
        this.price.textContent = data.price.toFixed(2);
        this.num.textContent = data.num;
    }
    //更新小计
    Item.prototype = {
        updateSubtotal:function(){
            this.subtotal.textContent = (this.data.num * this.data.price).toFixed(2);
        }
    }


    //Find查找器
    function Find(obj){
        this.obj = obj;
    }

    Find.prototype = {
        prefix : "",  //通过HTML Class命名的前缀找到相应的元素（对象）
        //等同于将cart—提取出来作为前缀
        className:function(className){
            return this.obj.getElementsByClassName(this.prefix + "-" + className)[0];
        }
    }
    window['ShopCart'] = ShopCart;
})(window);